%% @doc 模块名称定义。
%% 'sup' 后缀通常表示这是一个 Supervisor 模块。
-module(emqx_plugin_rabbitmq_sup).

%% @doc 声明该模块实现 OTP supervisor 行为。
%% 这意味着本模块需要导出一组特定的回调函数 (如 init/1)。
%% Java类比: 实现一个特定的接口，如 Runnable 或 Callable，但 supervisor 的职责远不止于此，它是一个进程监控和管理器。
-behaviour(supervisor).

%% @doc 导出 start_link/0 函数。
%% start_link 是 OTP Supervisor 推荐的启动函数名。
-export([start_link/0]).

%% @doc 导出 init/1 函数。
%% init/1 是 supervisor 行为必须实现的回调函数，用于初始化 Supervisor。
-export([init/1]).

%% @doc 启动 Supervisor 进程并进行链接。
%% 当此函数被调用时，一个新的 Supervisor 进程会被创建。
%% supervisor:start_link({local, Name}, Module, Args) -> {ok, Pid} | ignore | {error, Reason}
%%   {local, ?MODULE}: 在本地将此 Supervisor 注册为原子 ?MODULE (即 emqx_plugin_rabbitmq_sup)。
%%                     这样其他进程可以通过这个名字来引用它。
%%   ?MODULE: 指定 Supervisor 的回调模块是当前模块。
%%   []: 传递给 init/1 函数的参数列表，这里为空。
%% Java类比: 类似于启动一个专门的管理器线程或服务，并赋予其一个已知的名称以便其他组件可以与之交互。
start_link() ->
    supervisor:start_link({local, ?MODULE}, ?MODULE, []).

%% @doc Supervisor 初始化回调函数。
%% 当 supervisor:start_link 调用时，此函数在新创建的 Supervisor 进程中执行。
%% Args: 从 start_link/3 传递过来的参数，这里是 []。
%% 返回值必须是 {ok, {RestartStrategy, [ChildSpec]}} 或其他特定原子。
init([]) ->
    %% Supervisor 的重启策略配置。
    %% {RestartStrategy, MaxRestart, MaxTimeInSeconds}
    %%   RestartStrategy: one_for_all | one_for_one | rest_for_one | simple_one_for_one
    %%     one_for_all: 如果一个子进程终止，所有其他子进程也会被终止，然后所有子进程（根据其重启类型）都会被重启。
    %%                  适用于子进程之间有强依赖的场景。
    %%   MaxRestart: 在 MaxTimeInSeconds 周期内，允许的最大重启次数。
    %%   MaxTimeInSeconds: 定义重启频率的时间窗口（秒）。
    %% 这里设置为 {one_for_all, 0, 1} 表示：
    %%   - 使用 one_for_all 策略。
    %%   - 在 1 秒内，如果重启次数超过 0 次 (即任何一次重启失败)，则 Supervisor 自身会终止。
    %%     这是一种比较严格的策略，通常用于表示如果子进程无法稳定运行，则整个监督结构都有问题。
    RestartStrategy = {one_for_all, 0, 1},

    %% 子进程规格列表 (Child Specifications)。
    %% 每个 ChildSpec 定义了一个由该 Supervisor 监控的子进程。
    %% 格式通常是 {Id, StartFunc, Restart, Shutdown, Type, Modules}。
    %% 在这个例子中，子进程列表为空 []。
    %% 这意味着这个 Supervisor 目前不直接启动或管理任何子 Worker 进程。
    %% 它可能是一个更高层级的 Supervisor，或者其子进程是动态添加的。
    %% 或者，这个插件的 Worker 进程是由 emqx_plugin_rabbitmq_app (application behaviour) 管理的资源。
    Children = [],

    {ok, {RestartStrategy, Children}}.